package c03.thread.api.interrupt;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.InterruptSleepThread")
public class InterruptSleepThread {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            log.debug("start sleep");
            try {
                Thread.sleep(3000);
                log.debug("stop sleep");
            } catch (InterruptedException e) {
                e.printStackTrace();
                log.debug("after t.interrupt() t.isInterrupted() = {}", Thread.currentThread().isInterrupted()); //false
            }
        }, "t");

        t.start();
        Thread.sleep(1000); // 保证此时t线程已进入TIMED_WAITING
        log.debug("before t.interrupt() t.isInterrupted() = {}", t.isInterrupted()); // false
//        log.debug("before t.interrupt() t.isInterrupted() = {}", t.isInterrupted()); // false
        t.interrupt(); // 清除t的打断标记
        /*
        1. 如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException，并清除打断标记 ;
        2. 如果打断的正在运行的线程,则会设置 打断标记 ;
        3. park 的线程被打断,也会设置 打断标记
         */
        log.debug("after t.interrupt() t.isInterrupted() = {}", t.isInterrupted());
        /*
        结果：true，对照规则1应该为false。
        原因：虽然执行了t.interrupt()，但并不能保证上面的代码在t线程被打断后才执行。即上面的代码有可能在t1线程被打断前执行。
         */
    }
}
